package hao.bk.sql.sqlutils;

import hao.bk.royalmap.RoyalMapActivity;
import hao.bk.utils.Constants;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.channels.FileChannel;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Environment;
import android.util.Log;

/** Tạo, copy kết nối CSDL
 * 
 * @author Haodv
 *
 */
public class SQLiteHelper extends SQLiteOpenHelper {

	private RoyalMapActivity context;
	private String dataPath;
	private static final int DATABASE_VERSION = 1;
	private static final String DATABASE_NAME = "RoyalMap.db";
	public SQLiteHelper(RoyalMapActivity context) {
		super(context, DATABASE_NAME,
				null,
				DATABASE_VERSION);
		this.context = context;
		// Tạo đường dẫn đến file, nếu chưa có file thì tạo file với tên đã cho.
		dataPath = context.getFilesDir().getAbsolutePath()
				.replace("files", "databases")
				+ File.separator + DATABASE_NAME;
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		//createDataBase();
	}
	/**
	 * Mở database để thao tác dữ liệu
	 * @return
	 * @throws SQLException
	 */
	public SQLiteDatabase open() throws SQLException {

		SQLiteDatabase database = null;
		try {
			
			database = getWritableDatabase();

		}catch (SQLiteException e) {
			Log.e(Constants.TAG, "Không kết nối được database:", e);
			
		}catch (Exception e) {
			Log.e(Constants.TAG, "Không kết nối được database" + e.toString());
		}

		return database;
	}

	/**
	 * Đóng database khi kết thúc các thao tác với CSDL
	 * @param database
	 */
	public static void closeDB(SQLiteDatabase database) {
		if(database != null && database.isOpen()){
			database.close();
		}
	}
	/**
	 * chuyển đổi thông tin của file database từ folder [asset] thành mảng byte
	 * @param dbName
	 * @return
	 * @throws IOException
	 */
	private byte[] converFileToByte(String dbName) throws IOException {
		byte[] result = null;

		// Mở file database trong thư mục assets
		InputStream is = context.getAssets().open(dbName);
		if (is != null) {
			int size = is.available();
			if(size > 0){
				// Đẩy dữ liệu vào buffer
				result = new byte[size];
				is.read(result);
			}
			is.close();
		}
		return result;
	}

	/**
	 * copy database từ folder asset tới DB được tạo trong hệ thông, từ đó có thể truy cập và xử lý.
	 * 
	 */
	private void copyDataBase(){

		try {

			File dbFile = new File(dataPath);

			//Đẩy dữ liệu vào buffer
			byte[] buffer = converFileToByte(DATABASE_NAME);
			
			if(buffer != null){
				//nghi dữ liệu vào file
				FileOutputStream out = new FileOutputStream(dbFile);
				out.write(buffer);
				out.close();
			}
			
		} catch (Exception e) {
			Log.e(Constants.TAG,
					"Không thể copy dữ liệu vào máy" + e.toString());
		}

	}

	/**
	 * Tạo database rỗng trên hệ thống rồi ghi đè nó với database của mình
	 * 
	 * @throws java.io.IOException
	 *             io exception
	 */
	public void createDataBase() {

		boolean dbExist = checkDataBase();

		if (!dbExist) {
			try {
				
				this.getReadableDatabase();
				copyDataBase();

			} catch (SQLiteException e) {
				Log.e(Constants.TAG, "Không copy được database");
			}finally{
				this.close();
			}
		}
	}

	/**
	 * Kiểm tra database đã tồn tại để tránh copy file mỗi lần mở ứng dụng.
	 * 
	 * @return true nếu tồn tại database, false nếu không tồn tại database
	 */
	private boolean checkDataBase() {

		File dbFile = new File(dataPath);
		return dbFile.exists();
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		//Log.e(Constants.TAG, "onUpgrade: oldVersion = " + oldVersion + ";newVersion =" +newVersion);
	}
	
	public void exportDatabse() {
        try {
            File sd = Environment.getExternalStorageDirectory();
            File data = Environment.getDataDirectory();

            if (sd.canWrite()) {
                String currentDBPath = "//data//"+context.getPackageName()+"//databases//"+DATABASE_NAME+"";
                String backupDBPath = "backupname_RoyalMap.db";
                File currentDB = new File(data, currentDBPath);
                File backupDB = new File(sd, backupDBPath);

                if (currentDB.exists()) {
                    FileChannel src = new FileInputStream(currentDB).getChannel();
                    FileChannel dst = new FileOutputStream(backupDB).getChannel();
                    dst.transferFrom(src, 0, src.size());
                    src.close();
                    dst.close();
                }
            }
        } catch (Exception e) {

        }
    }

}
